/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package familytree.negocio.bo;

import familytree.negocio.IAlbumProcessor;
import familytree.exception.FileSizeTooLongException;
import familytree.negocio.IImagenProcessor;
import familytree.persistencia.dao.AlbumDAO;
import familytree.persistencia.dao.DAOFactory;
import familytree.persistencia.pojos.Album;
import familytree.persistencia.pojos.Imagen;
import familytree.persistencia.pojos.Nodo;
import familytree.persistencia.pojos.Usuario;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 *
 * @author Antonio
 */
public class AlbumBO implements IAlbumProcessor {

    private DAOFactory dAOFactory = DAOFactory.instance(DAOFactory.HIBERNATE);

    public Album createImagenes(Album album, String ruta) {
        Album ab = album;
        List<File> imagenesFiles = new ArrayList<File>();
        for (Imagen imagen : album.getImagenes()) {
            IImagenProcessor imagenBO = new ImagenBO();
            imagenesFiles.add(imagenBO.blobToFile(imagen.getImagenBlob(),imagen.getIdImagen(), imagen.getExtension(), ruta));
        }

        ab.setImagenesFile(imagenesFiles);
        return ab;
    }

    public boolean existeAlbum(String nombre, Nodo nodo) {

        String idArbol = nodo.getArbol().getIdArbol();
        AlbumDAO adao = dAOFactory.getAlbumDAO();
        if (adao.getAlbumByName(nombre, idArbol).isEmpty()) {
            return false;
        }
        return true;
    }

    public Album getAlbum(String nombreAlbum, Nodo nodo) {
        String idArbol = nodo.getArbol().getIdArbol();
        AlbumDAO adao = dAOFactory.getAlbumDAO();
        List<Album> album =  adao.getAlbumByName(nombreAlbum, idArbol);
        if (album.isEmpty())
            album = adao.getAlbumByName(nombreAlbum, idArbol);
        return album.get(0);
                
    }

    public Album insertImagen(byte[] arrayImagen, String nombreArchivo,
            String nombre, Nodo nodo, Usuario usuario, String nombreAlbum)
            throws FileSizeTooLongException {


        if (arrayImagen.length > ImagenBO.TAMANOMAXIMO) {
            throw new FileSizeTooLongException();
        }
        Album album;
        AlbumDAO adao = dAOFactory.getAlbumDAO();
        Imagen imagen = new Imagen();
        ImagenBO imagenBO = new ImagenBO();
        String extension = imagenBO.getExtension(nombreArchivo);

        album = getAlbum(nombreAlbum, nodo);
        imagen.setExtension(extension);
        imagen.setTitulo(nombre);
        imagen.setFecha(Calendar.getInstance());
        adao.addImagen(imagen, album, arrayImagen, usuario);
        return getAlbum(nombreAlbum, nodo);
    }

    public void insertaAlbum(Album album, Usuario usuario) {

        album.setFecha(Calendar.getInstance());
        AlbumDAO adao = dAOFactory.getAlbumDAO();
        adao.insertAlbum(album, usuario.getIdUsuario());

    }

    public List<Album> getAlbumes(Nodo n) {

        AlbumDAO adao = dAOFactory.getAlbumDAO();
        return adao.getAlbumByFamily(n.getArbol().getIdArbol());
    }

    public File getImagenPortada(Album album, String ruta) {
        ImagenBO imagenBO = new ImagenBO();
        File file = null;
        Iterator<Imagen> it = album.getImagenes().iterator();
        if (it.hasNext()) {
            Imagen im = it.next();
            file = imagenBO.blobToFile(im.getImagenBlob(),im.getIdImagen(), im.getExtension(), ruta);
        }
        return file;
    }

    public Map<String, File> getImagenesPortadas(Nodo nodo, String ruta) {
        
        Map<String,File> mapa = new HashMap<String, File>();
        List<Album> lista = getAlbumes(nodo);
        for(Album album: lista){
            File f = getImagenPortada(album, ruta);
            if(f != null)
                mapa.put(album.getNombre(),f);            
        }
        return mapa;        
    }
    public List<Imagen> listaImagenes(Set<Imagen> imagenes)
    {
        List<Imagen> l = new ArrayList<Imagen>();
        Iterator it=imagenes.iterator();
        while(it.hasNext()){
            l.add((Imagen)it.next());
        }
        return l;
    }
   
}
